<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>晴天快乐</title>
</head>

<body>

    <form id="test-form" action="test">
        <legend>请选择想要学习的编程语言：</legend>
        <fieldset>
            <p><label class="selectAll"><input type="checkbox"> <span class="selectAll">全选</span>
              <span class="deselectAll">全不选</span></label> 
              <a href="#0" class="invertSelect">反选</a></p>
            <p><label><input type="checkbox" name="lang" value="javascript"> JavaScript</label></p>
            <p><label><input type="checkbox" name="lang" value="python"> Python</label></p>
            <p><label><input type="checkbox" name="lang" value="ruby"> Ruby</label></p>
            <p><label><input type="checkbox" name="lang" value="haskell"> Haskell</label></p>
            <p><label><input type="checkbox" name="lang" value="scheme"> Scheme</label></p>
            <p><button type="submit">Submit</button></p>
        </fieldset>
    </form>

    <script src="./jq/jquery-3.5.1.js"> </script>


    <script>
//       + 绑定合适的事件处理函数，实现以下逻辑：

// + 当用户勾上“全选”时，自动选中所有语言，并把“全选”变成“全不选”；

// + 当用户去掉“全不选”时，自动不选中所有语言；

// + 当用户点击“反选”时，自动把所有语言状态反转（选中的变为未选，未选的变为选中）；

// + 当用户把所有语言都手动勾上时，“全选”被自动勾上，并变为“全不选”；

// + 当用户手动去掉选中至少一种语言时，“全不选”自动被去掉选中，并变为“全选”。

'use strict';

var
    form = $('#test-form'),   //可以选择到整体
    langs = form.find('[name=lang]'),  //通过form去查找name=lang的子节点
    selectAll = form.find('label.selectAll :checkbox'), //通过form去查找到全选的框
    selectAllLabel = form.find('label.selectAll span.selectAll'), //通过form去查找到全选的label字体
    deselectAllLabel = form.find('label.selectAll span.deselectAll'), //通过form去查找到全不选的label字体
    invertSelect = form.find('a.invertSelect');   //通过form去查找到反选的框 

    


// 重置初始化状态:
form.find('*').show().off();   
form.find(':checkbox').prop('checked', false).off();  
deselectAllLabel.hide();
// 拦截form提交事件:
form.off().submit(function (e) {
    e.preventDefault();  //preventDefault()是通知浏览器不要执行与事件关联的默认动作
    alert(form.serialize());  //serialize() 方法通过序列化表单值
});

// TODO:绑定事件

function updateLabel() {
  let allChecked = langs.filter(':checked').length === langs.length  //通过这个去判断选中的长度是否与langs.length的长度相等

  selectAll.prop('checked', allChecked)  //全选框的(动态)属性进行绑定true或者false

  if (allChecked) {         //当allchecked为true时
    selectAllLabel.hide()      //全选的字体隐藏
    deselectAllLabel.show()   //不全选的字体展示
  } else {
    selectAllLabel.show()      //全选的字体显示
    deselectAllLabel.hide()    //不全选的字体隐藏
  }

}

    // 当元素的值发生改变时，会发生 change 事件 该事件仅适用于文本域（text field）
   // 全选框绑定change事件 
selectAll.change(function(e) {
  langs.prop('checked', $(this).is(':checked'))   //langs的五个小框框判断是不是都选中
  updateLabel()                           
})

//反选框绑定事件 为langs.click() 
invertSelect.click(function(e) {            
  langs.click()  
})

//langs绑定updatelabel事件
langs.change(() => updateLabel())    


    </script>



</body>





</html>